package com.heima.user.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.apis.wemedia.IUserClient;
import com.heima.common.constants.UserConstants;
import com.heima.model.common.dtos.PageResponseResult;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.user.dtos.AuthDto;
import com.heima.model.user.pojos.ApUser;
import com.heima.model.user.pojos.ApUserRealname;
import com.heima.model.wemedia.dtos.WmUserDto;
import com.heima.user.mapper.ApUserRealnameMapper;
import com.heima.user.service.ApUserRealnameService;
import com.heima.user.service.ApUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * <p>
 * APP实名认证信息表 服务实现类
 * </p>
 *
 * @author longjialian
 */
@Slf4j
@Service
@Transactional
public class ApUserRealnameServiceImpl extends ServiceImpl<ApUserRealnameMapper, ApUserRealname> implements ApUserRealnameService {

    @Autowired
    private ApUserRealnameService apUserRealnameService;

    @Autowired
    private ApUserService apUserService;

    @Autowired
    private IUserClient iUserClient;

    /**
     * 运维端用户审核的查询列表功能
     *
     * @param dto
     * @return
     */
    @Override
    public ResponseResult list(AuthDto dto) {
        log.info("用户审核的查询列表");
        // 1.检查参数
        dto.checkParam();
        // 判断参数是否为空
        if (dto == null) {
            // 为空返回缺少参数
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_REQUIRE);
        }
        // 2.进行分页
        // 使用mybatisplus自带的功能进行计算页数
        IPage page = new Page(dto.getPage(), dto.getSize());
        // select * from ap_user_realname
        // where id = ?
        LambdaQueryWrapper<ApUserRealname> userLqw = new LambdaQueryWrapper<>();
        userLqw.orderByDesc(ApUserRealname::getCreatedTime);
        // 查询出所以符合条件的数据
        //page = page(page,userLqw);

        page(page, userLqw);
        //3.结果返回
        ResponseResult responseResult = new PageResponseResult(dto.getPage(), dto.getSize(), (int) page.getTotal());
        // 将page里面的data数据修改
        responseResult.setData(page.getRecords());
        return responseResult;
    }

    /**
     * 运维端用户审核的审核失败功能
     *
     * @param dto
     * @return
     */
    @Override
    public ResponseResult authFail(AuthDto dto) {
        // 1.检查参数
        dto.checkParam();
        // 判断参数是否为空
        if (dto == null) {
            // 为空返回缺少参数
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_REQUIRE);
        }
        // select * from ap_user_realname
        // where id = ?
        //使用MybatisPlus中的条件查询
        LambdaQueryWrapper<ApUserRealname> aurLqw = new LambdaQueryWrapper<>();
        aurLqw.eq(ApUserRealname::getId, dto.getId());
        // 通过id查询满足条件的信息
        ApUserRealname realname = apUserRealnameService.getById(dto.getId());
        // 判断信息是否为空
        if (realname == null) {
            // 返回数据不存在
            return ResponseResult.errorResult(AppHttpCodeEnum.AP_USER_REALNAME_NOT_EXIST);
        }
        // 修改拒绝原因
        realname.setReason(dto.getMsg());
        // 修改状态
        realname.setStatus(UserConstants.NOT_PASS);
        // 通过id更新ApUserRealname表
        updateById(realname);
        return ResponseResult.okResult(realname);
    }

    /**
     * 运维端用户审核的审核成功功能
     *
     * @param dto
     * @return
     */
    @Override
    public ResponseResult authPass(AuthDto dto) {
        // 1.检查参数
        dto.checkParam();
        // 判断参数是否为空
        if (dto == null) {
            // 为空返回缺少参数
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_REQUIRE);
        }
        // select * from ap_user_realname
        // where id = ?
        //使用MybatisPlus中的条件查询
        LambdaQueryWrapper<ApUserRealname> aurLqw = new LambdaQueryWrapper<>();
        aurLqw.eq(ApUserRealname::getId, dto.getId());
        // 通过id查询满足条件的信息
        ApUserRealname realname = apUserRealnameService.getById(dto.getId());
        // 判断信息是否为空
        if (realname == null) {
            // 返回数据不存在
            return ResponseResult.errorResult(AppHttpCodeEnum.AP_USER_REALNAME_NOT_EXIST);
        }
        // 修改状态
        realname.setStatus(UserConstants.PASS);
        // 通过id更新ApUserRealname表
        updateById(realname);
        // 通过ApUserRealname表的userId查询ApUser表的id
        ApUser user = apUserService.getById(realname.getUserId());
        // 对自媒体用户表初始化
        WmUserDto wmUserDto = new WmUserDto();
        // 自媒体用户表拷贝ApUserRealname表的相同属性
        BeanUtils.copyProperties(user, wmUserDto);
        // 调用用户微服务的fegin接口保存用户的id,用户名,密码
        iUserClient.saveWmUser(wmUserDto);
        return ResponseResult.okResult(realname);
    }
}
